/**
 * 注意：
 * 1.类型都是以小写开头，大写开头的是interface
 */

// boolean类型
let isDone: boolean = false
// 报错
// let isDone: boolean = 1

// number类型
let age: number = 20
// 也支持二进制类型
let binaryNumber: number = 0b1111

// string类型
let firstName: string = 'cimi'
// 支持模板字符串
let message: string = `hello, ${firstName}, age is ${age}`

// undefined和null
let u: undefined = undefined
let n: null = null

// 可以将undefined和null赋值给number，undefined和null是所有类型的子类型
let num: number = undefined
let num1: number = null
let o: object = null

// any类型
let notSure: any = 4
notSure = 'cimi'
notSure = true

notSure.myName
notSure.getName()

// union type
// let numberOrString: number | string
// numberOrString = 123
// numberOrString = 'cimi'
// numberOrString = true

// array type
// let arrOfNumbers: number[] = [1, 2, 3, 4]
// let arrOfNumbers: number[] = [1, 2, 3, 'cimi']  // 报错
// arrOfNumbers.push(5)
// arrOfNumbers.push('123')  // 报错

// tuple type
// let user: [string, number] = ['cimi', 20]
// // let user: [string, number] = ['cimi'] // 少写一项，报错
// user = ['cimi2', 2, true] // 多写一项，也报错

// unknown type
// const isFalsy = (value: unknown): boolean => {
// 	console.log(value.show) // 使用时会有限制提示
// 	return value === 0 ? false : !value
// }

// // 可以传入任何值，不报错
// isFalsy({})
// isFalsy(false)
// isFalsy([])

// never type
// 这个 func 返回的就是 never 类型，用的比较少，在类型操作等场景会用到
const func = (): never => {
	throw new Error()
}
